package com.atguigu.servlet;

import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;

public class Servlet06ServletContext extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 测试目标：验证 ServletContext 可以把虚拟路径转换为物理路径
        // 应用场景：在开发业务功能时，如果需要通过 I/O 技术读写文件，那么就需要用到物理路径
        // 难点：物理路径不具备可迁移性，不能在 Java 代码中写死
        // 解决思路：虚拟路径在任何环境下都不变，可以迁移，所以借助 ServletContext 对象把虚拟路径转换为当前实时环境下的物理路径

        // 具体操作代码如下：
        // 1、获取 ServletContext 对象
        ServletContext servletContext = getServletContext();

        // 2、声明要读取的资源的虚拟路径
        // 这个虚拟路径，不管是本地的开发环境下，还是服务器上，都是这么写
        String virtualPath = "/WEB-INF/web.xml";

        // 3、调用 ServletContext 对象的 getRealPath 方法，把虚拟路径转换为当前环境下的物理路径
        String realPath = servletContext.getRealPath(virtualPath);

        // 4、创建一个字符输入流对象来读取这个文件
        FileReader fileReader = new FileReader(realPath);

        // 5、读取文件内容，并作为响应返回
        resp.setContentType("text/xml;charset=utf-8");
        PrintWriter writer = resp.getWriter();
        char[] buffer = new char[1024];
        int len = -1;
        while ((len = fileReader.read(buffer)) != -1) {
            writer.write(new String(buffer, 0, len));
        }

    }
}
